//package com.bwie.gateway.filters;
//
//import com.bwie.common.constants.JwtConstants;
//import com.bwie.common.constants.RedisConstants;
//import com.bwie.common.constants.TokenConstants;
//import com.bwie.common.utils.JwtUtils;
//import com.bwie.common.utils.StringUtils;
//import com.bwie.gateway.config.IgnoreWhitesConfig;
//import com.bwie.gateway.constants.FilterConstants;
//import com.bwie.gateway.utils.GatewayUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.core.Ordered;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.stereotype.Component;
//import org.springframework.web.server.ServerWebExchange;
//import reactor.core.publisher.Mono;
//
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//
///**
// * 网关 鉴权
// */
//@Component
//public class LoginFilter implements GlobalFilter, Ordered {
//    @Autowired
//    private IgnoreWhitesConfig ignoreWhitesConfig;
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//    /**
//     * 登录拦截 验证token
//     * @param exchange
//     * @param chain
//     * @return
//     */
//    @Override
//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        //获取所有白名单
//        List<String> whites = ignoreWhitesConfig.getWhites();
//
//        //获取本次请求uri 进行比对是否在白名单中
//        ServerHttpRequest request = exchange.getRequest();
//        String path = request.getURI().getPath();
//        if(StringUtils.matches(path,whites)){
//            //在白名单中直接放行
//            return chain.filter(exchange);
//        }
//
//        //不在白名单 验证token
//        String token = request.getHeaders().getFirst(TokenConstants.TOKEN);
//        if(StringUtils.isBlank(token)){
//            return GatewayUtils.errorResponse(exchange, FilterConstants.TOKEN_NULL);
//        }
//        //token是否合法
//        try {
//            JwtUtils.parseToken(token);
//        }catch (Exception e){
//            return GatewayUtils.errorResponse(exchange,FilterConstants.TOKEN_NOT_LEGAL);
//        }
//        //token是否过期
//        String userKey = JwtUtils.getUserKey(token);
//        Boolean b = redisTemplate.hasKey(RedisConstants.LOGIN_USER + userKey);
//        if(!b){
//            return GatewayUtils.errorResponse(exchange,FilterConstants.TOKEN_EXPIRED);
//        }
//        redisTemplate.expire(RedisConstants.LOGIN_USER + userKey,30, TimeUnit.MINUTES);
//
//        //放行
//        return chain.filter(exchange);
//    }
//
//    /**
//     * 权重
//     * @return
//     */
//    @Override
//    public int getOrder() {
//        return 1;
//    }
//}
